SPSS ALTER TYPE 命令 – 简明教程

作者:Ruben Geert van den Berg,出自 SPSS A-Z

SPSS 的 ALTER TYPE 命令主要用于将 字符串变量 转换为 数值型变量。 然而,它还有其他有趣的用途。本教程将快速引导您了解这些用途,并指出一些潜在的陷阱、技巧和窍门。 您可以下载并打开 holidays.sav 文件来跟随教程操作,但您需要 SPSS 16 或更高版本才能使用 ALTER TYPE 命令。

SPSS ALTER TYPE 命令数据截图

SPSS ALTER TYPE 陷阱

虽然 ALTER TYPE 是快速完成许多事情的绝佳选择,但它有一个主要的缺点:如果它未能转换一个或多个值,它将返回系统缺失值 而不发出任何警告或错误。 如果未检测到这一点,可能会严重损害您的数据并导致研究结果产生偏差。即使您确实注意到 ALTER TYPE 导致的系统缺失值,也很难追踪出现问题的原因(如果有的话),因为原始值已被覆盖。

安全策略

我们提出两种基本的安全策略

  • 始终在转换变量之前复制它们。一个用于克隆数据中许多(或所有)变量的绝佳工具可以从 Clone Variables 免费下载。
  • 直接在原始变量上运行 ALTER TYPE,但之后立即检查结果中是否存在系统缺失值。如果存在且您不知道原因,请关闭您的数据,重新运行您的 语法 直到可疑的 ALTER TYPE 命令,并检查哪些值可能导致了问题。

SPSS ALTER TYPE - 字符串转换为数值

我们想知道参与者的平均年龄,但我们无法计算,因为年龄在我们数据中是一个字符串变量。下面的语法首先复制年龄,然后将其转换为数值变量。我们可以通过运行 DESCRIPTIVES 命令看到结果中没有缺失值;n 等于我们数据中的案例数。

SPSS ALTER TYPE 字符串转换为数值

SPSS ALTER TYPE 语法示例 1

***1. 用于创建新字符串变量的字符串命令。
**
string copy_age(a2).

***2. 将年龄复制到新的字符串变量中。
**
compute copy_age = age.

***3. 将字符串转换为数值型。
**
alter type age(f2).

***4. 检查缺失值和平均年龄。
**
descriptives age.

SPSS ALTER TYPE 没有缺失值

SPSS ALTER TYPE - 字符串转换为日期

现在我们来看 birthday(生日)。这是一个字符串变量,我们希望将其转换为 日期变量。 现在,SPSS 日期变量是数值型变量,保存着以秒为单位的数字,这些数字显示为普通日期。 它们有几个显示选项,可以在 date format 下找到一个快速概览。请注意,birthday 中的字符串值对应于日期值,如果它们的 format 设置为 DATE11 时,看起来的样子。 因此,我们必须在 ALTER TYPE 中指定 DATE11(下面的步骤 3),才能将 birthday 转换为日期变量。

SPSS ALTER TYPE 语法示例 2

***1. 创建新的字符串变量以复制 birthday。
**
string copy_birthday(a11).

***2. 将 birthday 值复制到新的字符串变量中。
**
compute copy_birthday = birthday.

***3. 将 birthday 转换为日期变量。
**
alter type birthday(date11).

***4. 检查缺失值。
**
descriptives birthday.

SPSS ALTER TYPE - 字符串转换为日期

请注意,start(开始)和 end(结束)也是字符串变量。 它们的值看起来像是显示为 EDATE10 的日期值。 我们将通过以下语法复制它们并将它们都转换为日期变量。

***1. 创建两个新的字符串变量。
**
string copy_start copy_end(a10).

***2. 将 start 和 end 的值复制到新的字符串变量中。
**
compute copy_start = start.
compute copy_end = end.

***3. 将两个字符串变量都转换为日期变量。
**
alter type start end(edate10).

来自 ALTER TYPE 的系统缺失值

请注意,ALTER TYPE 导致了一个系统缺失值,没有任何警告或错误。 幸运的是,我们在转换变量之前复制了它们,并且 copy_start 告诉我们,对于一个案例,日期和月份被颠倒了。 因为案例具有唯一的 id 值,所以我们可以通过将 DATE.DMYIF 结合起来轻松纠正这个问题,如下一个语法示例所示。

SPSS ALTER TYPE 命令系统缺失值
***设置 id = 482 的案例的正确开始日期。
**
if id = 482 start = date.dmy(15,12,2014).
exe.

SPSS ALTER TYPE - 过滤器

ALTER TYPE 的一个有趣但鲜为人知的功能是转换具有给定 format 的所有变量。 我们可以通过指定一个输入格式来做到这一点,然后它充当过滤器:ALTER TYPE 仅影响格式与此输入格式匹配的变量。 下面的示例首先寻址所有变量,但仅转换具有 EDATE 格式的变量。

***将数据中所有具有 edate 格式的变量转换为 date11。
**
alter type all (edate = date11).

SPSS ALTER TYPE - 更改字符串长度

ALTER TYPE 可以更改字符串变量的长度。 例如,我们数据中的最后一位受访者结婚了,并将她的姓氏更改为“Hernandez-Garcia”。 我们无法轻易纠正这一点:正如我们在 variable view 中看到的那样,last_name 具有 A9 格式,因此最多可以容纳 9 个字符。

SPSS ALTER TYPE 字符串长度不足

以下语法通过使用 ALTER TYPE 增加其长度来解决此问题。

***1. 这不起作用,因为新名称对于 A9 格式来说太长了。
**
if id = 595 last_name = 'Hernandez-Garcia'.
exe.

***2. 将 last_name 的字符串长度增加到(最大)30 个字符。
**
alter type last_name(a30).

***3. 现在 last_name 已成功更正。
**
if id = 595 last_name = 'Hernandez-Garcia'.
exe.

将数值变量的值标签转换为字符串变量

请注意,first_name 在我们的数据中是一个 数值型变量。 我们可以使用 ALTER TYPE 将其更改为字符串变量,但这将转换值(1 到 10)而不是值标签中的姓氏。 解决方案是使用 VALUELABEL,但整个过程需要一些手动步骤,如下面的语法所述。

***1. 创建新字符串以将值标签传递到其中。
**
string tmp(a30).

***2. 将值标签(姓氏)传递到字符串中。
**
compute tmp = valuelabels(first_name).
exe.

***3. 删除原始数值版本。
**
delete variables first_name.

***4. 将新变量重命名为旧变量名称。
**
rename variables tmp = first_name.

***5. 恢复原始变量顺序。
**
add files file */keep id first_name all.
exe.

SPSS ALTER TYPE - 最小化字符串长度

一个不错的 ALTER TYPE 技巧是最小化数据中所有字符串变量的长度。 我们可以通过将所有 A formats 设置为 AMIN 来做到这一点:这是一个特殊的 ALTER TYPE 关键字,表示每个字符串变量的最小长度。 在前面的示例中,我们猜测 30 个字符对于 first_namelast_name 来说已经足够了。 这些长度实际上比必要的要长,导致数据文件的大小增加。 我们可以通过使用前面提到的 过滤器 功能来轻松地最小化所有字符串长度alter type all(a = amin)

SPSS ALTER TYPE 最小化字符串宽度

正如我们从结果中看到的那样,first_namelast_name 所需的最小长度分别是 9 和 16。